home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / mac_io.c < prev    next >
Text File  |  1989-03-14  |  10KB  |  486 lines

  1. /*mac_io.c
  2.  * machine dependent serial I/O stuff for Macintosh
  3.  * (also contains overall Macintosh I/O initialization)
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "global.h"
  8. #include "iface.h"
  9. #include "mac.h"
  10. #include "mac_files.h"
  11.  
  12. #include <SerialDvr.h>
  13. #include <time.h>
  14.  
  15. struct Store_input Store_input[ASY_MAX];
  16. struct asy asy[ASY_MAX];
  17. static ioParam    MacSer;
  18. struct interface *ifaces;
  19. struct RemoveIt Head;
  20. unsigned nasy;
  21.  
  22. /* Called at startup time to set up console I/O, memory heap */
  23.  
  24. ioinit()
  25. {
  26. /* in unix library, long timezone is the difference between GMT and this
  27.  * time zone. tzname[0] is set to "EST", tzname[1] is set to "EDT".
  28.  * We leave these alone. There ought to be an option in NET.START to change
  29.  * these parameters.
  30.  */
  31.  
  32.     Click_On(1);    /* want the LSC EXIT window when we leave */
  33.     mac_files(1);    /* do the file init stuff */
  34.     return(0);
  35. }
  36.  
  37. /* Called just before exiting to restore console state */
  38.  
  39. iostop()
  40. {
  41.     int i;
  42.     struct RemoveIt *tp,*tp1;
  43.     WindowPeek        wRec;
  44.     WindowPtr       wind;
  45.  
  46.     Click_On(0);        /* Disable "click to continue" */
  47.     
  48.     /*
  49.         Close all application and DA windows that are open when
  50.         we leave the application.  In MultiFinder, DA's are not
  51.         effected since they don't reside in the application layer.
  52.     */
  53.     while ( FrontWindow() != NULL ){
  54.         wRec = (WindowPeek)FrontWindow();
  55.         if ((wRec->windowKind==dialogKind) || (wRec->windowKind==userKind))
  56.             HideWindow(FrontWindow()); /* nuke 'em */
  57.         else
  58.             CloseDeskAcc(wRec->windowKind);
  59.     }
  60.     
  61.     while(ifaces != NULLIF) {
  62.         if(ifaces->stop != NULLFP)
  63.             (*ifaces->stop)(ifaces);
  64.         ifaces = ifaces->next;
  65.     }
  66.     /*
  67.      * I want to close down all the files and then remove the (possibly still existing)
  68.      * files because the MAC will not allow the file to be removed when it still has an
  69.      * open file descriptor
  70.      */
  71.      
  72.     for( i = 3; i < _NFILE; i++)
  73.     {
  74.         close(i);
  75.     }
  76.     unlink(dirnet);
  77.  
  78. /* get our first entry, delete string but leave structure with null pointer */
  79.     tp = &Head;
  80.     if (tp->name_ptr != NULL) {
  81.         (void)unlink(tp->name_ptr);
  82.         (void)free(tp->name_ptr);
  83.     }
  84.     tp1 = tp->next;            /* prepare for loop that follows */
  85.     tp->next = NULL;        /* initialize pointer to next entry */
  86.     tp->name_ptr = NULL;    /* initialize string pointer */
  87.     
  88. /* now traverse list */
  89.     while(tp1 != NULL) {
  90.         tp = tp1;            /* get pointer to current entry */
  91.         tp1 = tp->next;        /* prepare pointer to next entry */
  92.         if (tp->name_ptr != NULL) {
  93.             (void)unlink(tp->name_ptr);
  94.             (void)free(tp->name_ptr);
  95.         }
  96.         (void)free(tp);
  97.     }
  98. }
  99.  
  100. /* Initialize asynch port "dev" */
  101.  
  102. int slipisopen = 0;
  103. SerShk HandShake;
  104.  
  105. int
  106. asy_init(dev,arg1,arg2,bufsize)
  107. int16 dev;
  108. unsigned bufsize;
  109. char *arg1,*arg2;
  110. {
  111.     register struct asy *ap;
  112.     register struct interface *if_asy;
  113.     extern struct interface *ifaces;
  114.     struct Store_input *store;
  115.     OsErr e;
  116.     char *Recv_buf;
  117.     char *Send_buf;
  118.     
  119.     ap = &asy[dev];
  120. #ifdef DEBUG
  121.     printf("asy_init: as->tty = %s, dev = %d.\n", ap->tty, dev); 
  122. #endif
  123.  
  124.     if ( ap == NULL)
  125.         return(-1);
  126.         
  127.     Recv_buf = malloc(bufsize);
  128.     if(Recv_buf == NULL) {
  129.         printf("asy_init: memory allocation error - Recv_buf.\n");
  130.         exit(-1);
  131.     } 
  132.     Send_buf = malloc(bufsize);
  133.     if(Send_buf == NULL) {
  134.         printf("asy_init: memory allocation error - Send_buf.\n");
  135.         exit(-1);
  136.     }
  137.     ap->recv_buf = malloc(bufsize); 
  138.     if(ap->recv_buf == NULL) {
  139.         printf("asy_init: memory allocation error - ap->recv_buf.\n");
  140.         exit(-1);
  141.     }
  142.  
  143.     /*
  144.      * the user can use either port 'a' or 'b'.  'A' is the preferred
  145.      */
  146.     
  147.     switch ( *arg2 )
  148.     {
  149.         case 'a':
  150.         case 'A':
  151.             if ( ap->devopen == 0 ) {
  152.                 if ( (e = RAMSDOpen(sPortA)) != noErr ) {
  153.                     printf("asy_init: RAMSDOpen failed, e = %d.\n",e);
  154.                     exit(-1);
  155.                 }
  156.                 ap->portIn = AinRefNum;
  157.                 ap->portOut = AoutRefNum;
  158.                 ap->devopen = 1;
  159.             }
  160.             else {
  161.                 printf("asy_init: Device %c is already open.\n", ap->tty[0]);
  162.                 return(-1);
  163.             }
  164.             break;
  165.         
  166.         case 'b':
  167.         case 'B':
  168.             if ( ap->devopen == 0) {
  169.                 if ( (e = RAMSDOpen(sPortB)) != noErr ) {
  170.                     printf("asy_init: RAMSDOpen failed, e = %d.\n", e);
  171.                     exit(-1);
  172.                 }
  173.                 ap->portIn = BinRefNum;
  174.                 ap->portOut = BoutRefNum;
  175.                 ap->devopen = 1;
  176.             }
  177.             else {
  178.                 printf("asy_init: Device %c is already open.\n", ap->tty[0] );
  179.                 return(-1);
  180.             }
  181.             break;
  182.         
  183.         default:
  184.             printf("asy_init: Unknown device %c, could not configure port.\n", ap->tty);
  185.             return(-1);
  186.     }
  187.     
  188.     /* setup the ring buffer for input on this device */    
  189.         
  190.     store = &Store_input[dev];
  191.     store->store = malloc(bufsize);
  192.     if(store->store == NULL) {
  193.         printf("asy_init: memory allocation error - Store_input.\n");
  194.         exit(-1);
  195.     }
  196.     store->head =  store->store;
  197.     store->tail = store->store;
  198.     store->amt = 0;
  199.     store->bufsize = bufsize; 
  200.     
  201.     /*
  202.      * tell the device that it can receive only bufsize
  203.      */
  204.  
  205.     if ( SerSetBuf( ap->portIn, Recv_buf, bufsize) != noErr) {
  206.         printf("asy_init: SerSetBuf error on %d.\n", ap->portIn);
  207.         exit(-1);
  208.     }
  209.  
  210.     if ( SerSetBuf( ap->portOut, Send_buf, bufsize) != noErr) {
  211.         printf("asy_init: SerSetBuf error on %d.\n", ap->portOut);
  212.         exit(-1);
  213.     }
  214.     
  215.     HandShake.fXOn = FALSE;        /* Setup handshake parms */
  216.     HandShake.fCTS = FALSE;
  217.     HandShake.xOn = 0x11;
  218.     HandShake.xOff = 0x13;
  219.     HandShake.errs = 0;
  220.     HandShake.evts = 0;
  221.     HandShake.fInX = FALSE;
  222.     HandShake.fDTR = 0;
  223.     
  224.     if (ap->addr == 1)
  225.         HandShake.fCTS = TRUE;
  226.  
  227.     slipisopen = 1;
  228.     return (0);
  229. }
  230.  
  231. int
  232. asy_stop(interface)
  233. struct interface *interface;
  234. {
  235.     register struct asy *ap;
  236.     
  237.     ap = &asy[interface->dev];
  238.  
  239.     if (slipisopen) {
  240.         /*
  241.          * kill off any io pending 
  242.          */
  243.         MacSer.ioActCount = 0;
  244.         MacSer.ioRefNum = ap->portIn;
  245.         MacSer.ioCompletion = 0;
  246.         MacSer.ioBuffer = ap->recv_buf;
  247.         MacSer.ioReqCount = 0;
  248.         MacSer.ioPosMode = 1;
  249.         PBKillIO(&MacSer, FALSE);
  250.  
  251.         if ( ap->portIn = AinRefNum)
  252.             RAMSDClose(sPortA);
  253.         else
  254.             RAMSDClose(sPortB);
  255.         
  256.         slipisopen = 0;
  257.     }
  258. }
  259.  
  260. /* Asynchronous line I/O control */
  261. asy_ioctl(interface,argc,argv)
  262. struct interface *interface;
  263. int argc;
  264. char *argv[];
  265. {
  266.     if(argc < 1) {
  267.         printf("%d\r\n",asy[interface->dev].speed);
  268.         return 0;
  269.     }
  270.     return asy_speed(interface->dev,atoi(argv[0]));
  271. }
  272.  
  273.  
  274. /* Set asynch line speed */
  275. int
  276. asy_speed(dev,speed)
  277. int dev;
  278. int speed;
  279. {
  280.     int serialconfig;
  281.     struct asy *ap;
  282.  
  283.     
  284.     ap = &asy[dev];
  285.  
  286.     if(speed == 0 || dev >= nasy)
  287.         return(-1);
  288.     
  289. #ifdef DEBUG
  290.     printf("asy_speed: Setting speed for device %d to %d\n",dev, speed);
  291. #endif
  292.     asy[dev].speed = speed;
  293.  
  294.     switch(speed)
  295.     {
  296.         case 300:
  297.             serialconfig = baud300;
  298.             break;
  299.         case 600:
  300.             serialconfig = baud600;
  301.             break;
  302.         case 1200:
  303.             serialconfig = baud1200;
  304.             break;
  305.         case 1800:
  306.             serialconfig = baud1800;
  307.             break;
  308.         case 2400:
  309.             serialconfig = baud2400;
  310.             break;
  311.         case 3600:
  312.             serialconfig = baud3600;
  313.             break;
  314.         case 4800:
  315.             serialconfig = baud4800;
  316.             break;
  317.         case 7200:
  318.             serialconfig = baud7200;
  319.             break;
  320.         case 9600:
  321.             serialconfig = baud9600;
  322.             break;
  323.         case 19200:
  324.             serialconfig = baud19200;
  325.             break;
  326.         case (long)57600:
  327.             serialconfig = baud57600;
  328.             break;
  329.         default:
  330.             printf("asy_speed: Unknown speed (%ld)\n", speed);
  331.             break;
  332.     }
  333.  
  334. #ifdef DEBUG
  335.     printf("serialconfig = %d\n", serialconfig);
  336. #endif
  337.  
  338.     serialconfig |= (stop10|noParity|data8);
  339.     
  340.     /* not set the speed up */
  341.  
  342.     if ( SerReset( ap->portIn, serialconfig) != noErr) {
  343.         printf("asy_speed: could not set config for %d.\n", ap->portIn);
  344.         exit(-1);
  345.     }
  346.     
  347.     if ( SerHShake(ap->portIn, &HandShake) != noErr) {
  348.         printf("asy_speed: could not set handshake for %d.\n", ap->portIn);
  349.         exit(-1);
  350.     }
  351.     
  352.     if ( SerReset( ap->portOut, serialconfig) != noErr) {
  353.         printf("asy_speed: could not set config for %d.\n", ap->portOut);
  354.         exit(-1);
  355.     }
  356.  
  357.     if ( SerHShake(ap->portOut, &HandShake) != noErr) {
  358.         printf("asy_speed: could not set handshake for %d.\n", ap->portOut);
  359.         exit(-1);
  360.     }
  361. #ifdef DEBUG
  362.     printf("asy_speed: completed.\n");
  363. #endif
  364.  
  365.     return(0);
  366.  
  367. }
  368. /* Send a buffer to serial transmitter */
  369. asy_output(dev,buf,cnt)
  370. unsigned dev;
  371. char *buf;
  372. unsigned short cnt;
  373. {
  374.     register struct asy *ap;
  375.     long amount = (long)cnt;
  376.     ap = &asy[dev];
  377.  
  378. #ifdef DEBUG
  379.     printf("asy_output called. dev = %x, cnt = %d\n", dev, cnt);
  380. #endif
  381.  
  382.     if(dev >= nasy)
  383.         return(-1);
  384.     FSWrite(ap->portOut,&amount, buf);
  385.     return(0);
  386.  
  387. }
  388.  
  389. /*
  390.  * Receive characters from asynch line
  391.  * Returns count of characters read
  392.  */
  393.  
  394. unsigned
  395. asy_recv(dev,buf,cnt)
  396. int dev;
  397. char *buf;
  398. unsigned cnt;
  399. {
  400.     long amount[8];
  401.     int tot = 0;
  402.     struct Store_input *store;
  403.     int got = 0;
  404.     int tt;
  405.      struct asy *ap;
  406.  
  407. #ifdef DEBUG
  408. printf("asy_recv: dev = %d\n", dev);    
  409. #endif
  410.  
  411.     if ( dev > nasy ) {
  412.         printf("asy_recv: Error on receive. dev = %d, max = %d\n", dev, nasy);
  413.         exit(-1);
  414.     }
  415.  
  416.     ap = &asy[dev];
  417.  
  418.     store = &Store_input[dev];        /* point to current */
  419.  
  420.     if ( cnt > 0 && store->amt > 0) {
  421.         tt = min(cnt,store->amt);
  422.         tt = min(tt,store->bufsize);
  423.         got = 0;
  424.         
  425.         while ( tt-- > 0) {
  426.             buf[got++] = *store->tail++;
  427.             if ( store->tail >= &store->store[store->bufsize])
  428.                 store->tail = store->store;    /* wrap around */
  429.             if ( got >= cnt )
  430.                 break;
  431.         }
  432.         store->amt -= got;
  433.         return( got );
  434.     }
  435.     else
  436.         if ( cnt == 0 )
  437.             return(0);
  438.     
  439.     /* 
  440.      * How much is waiting for us?  If any is waiting, this go and get it
  441.      */
  442.      
  443.     Status( ap->portIn, 2, &amount[0]);
  444.     if (  amount[0] > 0L) {
  445.         MacSer.ioRefNum = ap->portIn;
  446.         MacSer.ioCompletion = 0;
  447.         MacSer.ioBuffer = ap->recv_buf;
  448.         MacSer.ioReqCount = (amount[0] < store->bufsize) ? amount[0] : store->bufsize;
  449.         MacSer.ioPosMode = 1;
  450.         tot = PBRead(&MacSer, FALSE);
  451.         if ( MacSer.ioResult != noErr)
  452.             printf("asy_recv: Read failed. Device = %d.\n",dev);
  453.         tt = MacSer.ioActCount;
  454.         got = 0;
  455.         while (tt-- > 0) {
  456.             *store->head++ = ap->recv_buf[got++];
  457.             if ( store->head == &store->store[store->bufsize] ) {
  458.                 /* printf("xx got wrap\n"); */
  459.                 store->head = store->store;
  460.             }
  461.             store->amt++;
  462.         }
  463.         if ( cnt > 0 && store->amt > 0) {
  464.             tt = min(cnt,store->amt);
  465.             tt = min(tt,store->bufsize);
  466.             got = 0;
  467.         
  468.             /*
  469.              * now store it in the ring buffer
  470.              */
  471.             while ( tt-- > 0) {
  472.                 buf[got++] = *store->tail++;
  473.                 if ( store->tail >= &store->store[store->bufsize])
  474.                     store->tail = store->store;    /* wrap around */
  475.                 if ( got >= cnt )
  476.                     break;
  477.             }
  478.             store->amt -= got;
  479.             return( got );
  480.         }
  481.         return ( 0 );
  482.     }
  483.     return (got);
  484.  
  485. }
  486.